package com.itheima.controller;

import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.system.SystemBlockException;
import com.itheima.model.Item;
import com.itheima.service.ItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.*;

import java.util.concurrent.TimeUnit;

/**
 * @Author：shenkunlin
 * @date： 2021/7/5 11:49
 * @Description：
 ***/
@RestController
@RequestMapping(value = "/item")
//@RefreshScope
//@CrossOrigin
//当前类全局处理异常的方法
//@SentinelResource(defaultFallback = "defaultExcpetionHandler")
public class ItemController {


    //获取端口
    @Value("${server.port}")
    private Integer port;

    @Autowired
    private ItemService itemService;

    //Value("${city:深圳}")
    //rivate String city;

    @Autowired
    private Environment env;

    //===========================Sentinel Start================================
    //降级规则：只要当前资源发生异常，则降级执行指定的方法

    /***
     * 根据ID查询商品详情
     * 定义的资源：@SentinelResource(value="资源名字")
     */
    //@SentinelResource(value = "iteminfo",blockHandler = "blockExcpetionHandler")
    //@SentinelResource(value = "iteminfo",fallback = "excpetionHandler")
    //@SentinelResource(value = "iteminfo")
    //@SentinelResource
    @GetMapping(value = "/one/{id}")
    public Item one(@PathVariable(value = "id")Integer id) {
        if(id>2){
            try {
                Thread.sleep(300);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }else if(id>5){
            //抛出异常 BlockException
            //throw new SystemBlockException("iteminfo","服务器好繁忙！",new RuntimeException("尴尬了！"));
            throw new RuntimeException("尴尬了！");
        }
        return itemService.one(id);
    }

    /**
     * 处理全局Excpetion的降级方法
     *  注意要点：
     *      1：入参为空，最多可以有一个Throwable ex
     *      2：返回类型保持一致
     */
    public Item defaultExcpetionHandler(Throwable ex){
        Item item = new Item();
        item.setName("该商品下架了-defaultExcpetionHandler！");
        return item;
    }

    /**
     * 处理Excpetion的降级方法
     *  注意要点：
     *      1：入参一致，最多可以有一个Exception
     *      2：返回类型保持一致
     */
    public Item excpetionHandler(Integer id){
        Item item = new Item();
        item.setId(id);
        item.setName("该商品下架了-Excpetion！");
        return item;
    }

    /**
     * 处理BlockExcpetion的降级方法
     *  注意要点：
     *      1：入参一致，必须有一个BlockException
     *      2：返回类型保持一致
     */
    public Item blockExcpetionHandler(Integer id, BlockException ex){
        Item item = new Item();
        item.setId(id);
        item.setName("该商品下架了-BlockExcpetion！");
        return item;
    }
    //=============================Sentinel End==============================

    /**
     * 获取城市
     * @return
     */
    @GetMapping(value = "/city")
    public String getCity(){
        return env.getProperty("city");
    }

    /**
     * 修改库存，并返回单价
     * @param id : 商品ID
     * @param count : 购买商品个数（削减的库存数量）
     */
    @GetMapping(value = "/{id}/{count}")
    public int decrCount(@PathVariable(value = "id")Integer id,
                         @PathVariable(value = "count")Integer count){
        if(id>1){
            throw new RuntimeException("这不是你该买的东西！");
        }
        if(count>10){
            try {
                TimeUnit.SECONDS.sleep(6);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        System.out.println("当前服务端口->"+port);
        return itemService.decrCount(id,count);
    }
}
